(function ($) {
    /**
     * 获取url参数
     * @param name 参数KEY
     * @returns {null}
     */
    $.getUrlParam = function (name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return decodeURIComponent(r[2]); return null;
    }

    /**
     * form表单初始化
     * @param data 初始化数据
     * @ignoreArray 忽略字段
     * @returns {*}
     */
    $.fn.formatForm = function(data,ignoreArray){
        return this.each(function(){
            var input, name;
            if(data == null){this.reset(); return; }
            for(var i = 0; i < this.length; i++){
                input = this.elements[i];
                //checkbox的name可能是name[]数组形式
                if(input.type == 'file') continue ;//不填充input ile类型
                if($.inArray(input.type, ignoreArray) > -1 ) continue; //需要忽略的name值
                name = (input.type == "checkbox")? input.name.replace(/(.+)\[\]$/, "$1") : input.name;
                if(data[name] == undefined) continue;
                switch(input.type){
                    case "checkbox":
                        if(data[name] == ""){
                            input.checked = false;
                        }else{
                            //数组查找元素
                            if(data[name].indexOf(input.value) > -1){
                                input.checked = true;
                            }else{
                                input.checked = false;
                            }
                        }
                        break;
                    case "radio":
                        if(data[name] == ""){
                            input.checked = false;
                        }else if(input.value == data[name]){
                            input.checked = true;
                        }
                        break;
                    case "button": break;
                    default: input.value = data[name];
                }
            }
        });
    };

    /**
     * layDate日期范围初始化
     * @default YYYY-MM-DD hh:mm:ss
     * @需要导入layDate.js
     * @param startDate 起始日期
     * @param endDate 结束日期
     * @param edit 日期输入框可编辑
     * @Param dateFormart 日期格式
     */
    $.initDateScope = function (startDate,endDate,edit,dateFormart) {
        var formart = 'YYYY-MM-DD hh:mm:ss';
        var min = '1900-01-01 23:59:59';
        var max = '2099-06-16 23:59:59';
        if(dateFormart) {
            formart = dateFormart.toUpperCase();
            min = new Date(min).Format(dateFormart);
            max = new Date(max).Format(dateFormart);
        }
        $("#"+startDate).click(function () {
           $("#"+endDate).val('');
        });
        if(!edit){
            $("#"+startDate).attr("disable","true");
            $("#"+endDate).attr("disable","true");
        }
        var start = {
            elem: '#'+startDate,
            format: formart,
           // min: laydate.now(), //设定最小日期为当前日期
            min: min, //设定最小日期
            max: max, //最大日期
            fixed: false, //是否固定在可视区域
            istime: true,
            istoday: false,
            choose: function(datas){
                end.min = datas; //开始日选好后，重置结束日的最小日期
                end.start = datas //将结束日的初始值设定为开始日
            }
        };
        var end = {
            elem: '#'+endDate,
            format: formart,
            // min: laydate.now(),
            min: min, //设定最小日期
            max: max,
            istime: true,
            fixed: false, //是否固定在可视区域
            istoday: false,
            choose: function(datas){
                start.max = datas; //结束日选好后，重置开始日的最大日期
            }
        };
        laydate.skin('molv');
        laydate(start);
        laydate(end);
    }
    
    
    
    /**
     * layDate5.0.7时间范围初始化
     * @default HH:mm
     * @需要导入layDate5.0.7.js
     * @param startDate 起始时间
     * @param endDate 结束时间
     * @param edit 日期输入框可编辑
     */
    $.initTimeScope = function (startTime,endTime,edit) {
        var formart = 'H';
        var min = '0:00:00';
        var max = '23:00:00';
        
        if(!edit){
            $("#"+startTime).attr("disable","true");
            $("#"+endTime).attr("disable","true");
        }
        var start = {
            elem: '#'+startTime,
            type: 'time',
            format: formart,
            min: min,
            max: max,
            istime: true,
            fixed: false, //是否固定在可视区域
            change: function(value, date, endDate){
            	
            },
            done: function(value, date, endDate){	//点击确定后的回调函数
//            	var car =  $("#car_type").val();
//            	carAttrChange(car);
            }
        };
        var end = {
            elem: '#'+endTime,
            type: 'time',
            format: formart,
            min: min,
            max: max,
            istime: true,
            fixed: false, //是否固定在可视区域
            change: function(value, date, endDate){
            	
            },
            done: function(value, date, endDate){	//点击确定后的回调函数
//            	var car =  $("#car_type").val();
//            	carAttrChange(car);
            }
        };
        laydate.render(start);
        laydate.render(end);
    }
    
    
    
    /**
     * 对Date的扩展，将 Date 转化为指定格式的String
     * @param fmt 日期格式
     * @returns {*}
     * @constructor
     */
    Date.prototype.Format = function(fmt)
    {
        var o = {
            "M+" : this.getMonth()+1,                 //月份
            "d+" : this.getDate(),                    //日
            "h+" : this.getHours(),                   //小时
            "m+" : this.getMinutes(),                 //分
            "s+" : this.getSeconds(),                 //秒
            "q+" : Math.floor((this.getMonth()+3)/3), //季度
            "S"  : this.getMilliseconds()             //毫秒
        };
        if(/(y+)/.test(fmt))
            fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
        for(var k in o)
            if(new RegExp("("+ k +")").test(fmt))
                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
        return fmt;
    }

    /**
     * 文件上传
     * @param url 服务器地址
     * @param successFun 成功回调方法
     * @returns {*|{abort}}
     */
    $.fn.uploadFile = function (url,successFun) {
       return $.ajaxFileUpload({
            url:url,
            fileElementId:$(this).attr("id"),
            dataType:"json",
            success:successFun,
            error: function (data, status, e)//服务器响应失败处理函数
            {
                console.log(e);
            }
        });
    }


    /**
     * 文件上传初始化
     * @param url 上传地址
     * @param successFunction 上传成功回调方法
     * @param fileType 支持文件上传类型 ['jpg','gif']
     * @returns {*}
     */
    $.fn.fileUpload = function (url,successFunction,fileType) {
        return this.fineUploader({
            template: 'qq-template-gallery',
            request: {
                endpoint: url
            },
            validation: {
                allowedExtensions: fileType
            },
            multiple: false,
            text: {
                uploadButton: '<div>上传头像</div>'
            }
        }).on('complete', successFunction);
        // function (event, id, fileName, responseJson) {}
    }


    // Ajax 文件下载
    $.download = function (url, data, method) {
        // 获取url和data
        if (url && data) {
            // data 是 string 或者 array/object
            data = typeof data == 'string' ? data : jQuery.param(data);
            // 把参数组装成 form的  input
            var inputs = '';
            jQuery.each(data.split('&'), function () {
                var pair = this.split('=');
                inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />';
            });
            // request发送请求
            jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>')
                .appendTo('body').submit().remove();
        };
    };

    /**
     * 邮箱匹配
     * @param settings
     * @returns {*}
     */
    $.emailMatcher = function() {
        return function findEmailDomainMatches(queryString, cb) {
            var emailDomains = [
                'qq.com',
                '163.com',
                '126.com',
                'gmail.com',
                'hotmail.com',
                'outlook.com',
                'icloud.com',
                'foxmail.com',
                'sina.com',
                'sina.cn',
                '139.com',
                '139.cn'
            ];
            var matches = [];
            var atPosition = queryString.indexOf('@');

            if (atPosition < 0) {
                $.each(emailDomains, function(i, domain) {
                    matches.push({ value: queryString + '@' + domain });
                });
            } else if (atPosition > 0) {
                var username = queryString.substr(0, atPosition);
                var queryDomain = queryString.substr(atPosition + 1);

                var matchWholeDomain = false;
                var allRegex = new RegExp('^' + queryDomain + '$', 'i');
                $.each(emailDomains, function(i, domain) {
                    if (allRegex.test(domain)) {
                        matchWholeDomain = true;
                        return false;
                    }
                });
                if (matchWholeDomain) {
                    return cb(matches);
                }

                var matchStart = [];
                var matchAny = [];
                var startRegex = new RegExp('^' + queryDomain, 'i');
                var anyRegex = new RegExp(queryDomain, 'i');
                $.each(emailDomains, function(i, domain) {
                    if (startRegex.test(domain)) {
                        matchStart.push({ value: username + '@' + domain });
                    } else if (anyRegex.test(domain)) {
                        matchAny.push({ value: username + '@' + domain });
                    }
                });
                matches = matchStart.concat(matchAny);
            } else {

            }
            cb(matches.slice(0, 8));
        };
    };

})(jQuery);